package com.example.demo.config;

import com.example.demo.domain.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.*;
import reactor.core.publisher.Flux;

import java.util.Collection;

/**
 * @author Merlin
 * @Title: RouterFunctionConfiguration
 * @ProjectName 001spring-boot2-demo
 * @Description: TODO
 * @date 2018/6/2519:15
 */
@Configuration
public class RouterFunctionConfiguration {


    /**
     * Servlet
     *   请求接口：ServletRequest 或者 HttpServletRequest
     *   响应接口：ServletResponse 或者 HttpServletResponse
     *  Spring5.0 重新定义了服务请求和响应接口：
     *  请求接口：ServerRequest
     *  响应接口：ServerResponse
     *  即可支持 Servlet 规范，也可以支持自定义，比如Netty(Web Server)
     *  以本例：
     *  定义GET请求，并且返回所有的用户对象 URI:/person/find/all
     *  Flux 是0 - N 个对象集合
     *  Mono 是0 - 1 个对象集合
     *  Reactive 中的 Flux 或者 Mono 它是异步处理（非阻塞）
     *  集合对象基本上是同步处理（阻塞）
     *  Flux 或者 Mono都是Publisher
     *
     *  优点：异步非阻塞提高吞吐量
     */
    @Bean
    @Autowired
    public RouterFunction<ServerResponse> personFindAll(UserRepository userRepository){
        return RouterFunctions.route(RequestPredicates.GET("/person/find/all"),
                request ->{
                     //返回所有的用户对象
                    Collection<User> users=userRepository.findAll();
                    Flux<User> userFlux = Flux.fromIterable(users);
                    return ServerResponse.ok().body(userFlux,User.class);
                }
        );
    }




}
